home *** CD-ROM | disk | FTP | other *** search
- /*
- * Copyright (c) 1995, Silicon Graphics, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software and
- * its documentation for any purpose is hereby granted without fee, provided
- * that the name of Silicon Graphics may not be used in any advertising or
- * publicity relating to the software without the specific, prior written
- * permission of Silicon Graphics.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
- *
- * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
- * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER
- * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF THE
- * POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
- */
- /*----------------------------------------------------------------------------
- *
- * file : grafix.c
- *
- * Author : Yusuf Attarwala
- *
- *---------------------------------------------------------------------------*/
- #include <X11/keysym.h>
- #include <strings.h>
- #include "Xmincludes.h"
- #include <X11/Xirisw/GlxMDraw.h>
- #include "globals.h"
- #include "lm.h"
-
- #include <Xm/Protocols.h>
-
- Arg args[40];
- int argcnt;
-
- extern void doExit();
-
- void
- createGraphics(parent)
- Widget parent;
- {
- char *c;
- Widget frameD,frameS;
- Widget glwDbuffer,glwSbuffer;
- Widget gf;
-
- static int firstTime = 1;
- void gfxExposeCB(),
- gfxResizeCB(),
- gfxInitCB();
-
- Atom xaWmDeleteWindow = XmInternAtom(display,"WM_DELETE_WINDOW",TRUE);
-
- static GLXconfig glxConfigD [] = {
- { GLX_NORMAL, GLX_DOUBLE, TRUE },
- { GLX_NORMAL, GLX_RGB, TRUE },
- { GLX_NORMAL, GLX_ZSIZE, GLX_NOCONFIG },
- { 0, 0, 0 }
- };
-
- static GLXconfig glxConfigS [] = {
- { GLX_NORMAL, GLX_DOUBLE, FALSE },
- { GLX_NORMAL, GLX_RGB, TRUE },
- { GLX_NORMAL, GLX_ZSIZE, GLX_NOCONFIG },
- { 0, 0, 0 }
- };
-
- argcnt = 0;
- XtSetArg(args[argcnt],XmNtitle, "lmwarp - IRISGL");argcnt++;
- XtSetArg(args[argcnt],XmNiconName,"lmwarpI");argcnt++;
- XtSetArg(args[argcnt],XmNkeyboardFocusPolicy, XmPOINTER);argcnt++;
- XtSetArg(args[argcnt],XmNdeleteResponse, XmUNMAP);argcnt++;
- XtSetArg(args[argcnt],XmNdefaultPosition, False);argcnt++;
- XtSetArg(args[argcnt],XmNminWidth, 300);argcnt++;
- XtSetArg(args[argcnt],XmNminAspectX, 1);argcnt++;
- XtSetArg(args[argcnt],XmNminAspectY, 1);argcnt++;
- XtSetArg(args[argcnt],XmNmaxAspectX, 1);argcnt++;
- XtSetArg(args[argcnt],XmNmaxAspectY, 1);argcnt++;
-
-
- gf = XtCreatePopupShell("ui",
- topLevelShellWidgetClass,parent,args,argcnt);
-
- XmAddWMProtocolCallback(gf,xaWmDeleteWindow,doExit,0);
-
- /* double buffer widget */
- argcnt = 0;
- XtSetArg(args[argcnt], XmNbackground,BlackPixel(display,screen)); argcnt++;
- frameD = XtCreateWidget("frameD", xmFrameWidgetClass,
- gf, args, argcnt);
-
- XtManageChild(frameD);
-
- argcnt = 0;
- XtSetArg(args[argcnt], GlxNglxConfig, glxConfigD); argcnt++;
- glwDbuffer = XtCreateWidget("gfx", glxMDrawWidgetClass,
- frameD, args, argcnt);
- XtManageChild(glwDbuffer);
-
- XtAddCallback(glwDbuffer, GlxNexposeCallback, gfxExposeCB, NULL);
- XtAddCallback(glwDbuffer, GlxNresizeCallback, gfxResizeCB, NULL);
- XtAddCallback(glwDbuffer, GlxNginitCallback, gfxInitCB, NULL);
-
- /* default to double buffer */
- glw = glwDbuffer;
- XtManageChild(gf);
-
- if (firstTime) {
- firstTime = 0;
- }
-
- GLXwinset(XtDisplay(glw), XtWindow(glw));
- mmode(MPROJECTION);
- ortho(-10.0,10.0,-10.0,10.0,-5.0,10.0);
- mmode(MVIEWING);
- loadmatrix(identity);
- lmbind(LIGHT0,curLight);
-
- }
-
- void
- gfxExposeCB(w,cd,cbs)
- Widget w;
- XtPointer *cd;
- GlxDrawCallbackStruct *cbs;
- {
- GLXwinset(XtDisplay(w), cbs->window);
- drawScene();
- }
-
- void
- gfxResizeCB(w,cd,draw_struct)
- Widget w;
- XtPointer *cd;
- GlxDrawCallbackStruct *draw_struct;
- {
- if (draw_struct->event != (XEvent *)NULL) {
- window_width = draw_struct->event->xconfigure.width;
- window_height = draw_struct->event->xconfigure.height;
- }
- else {
- argcnt = 0;
- XtSetArg(args[argcnt], XmNwidth, &window_width); argcnt++;
- XtSetArg(args[argcnt], XmNheight, &window_height); argcnt++;
- XtGetValues(w,args,argcnt);
- }
-
- GLXwinset(XtDisplay(w), draw_struct->window);
- viewport(0, (Screencoord) draw_struct->width-1,
- 0, (Screencoord) draw_struct->height-1);
-
- drawScene();
-
-
- }
-
-
- void
- gfxInitCB(w,cd,cbs)
- Widget w;
- XtPointer *cd;
- GlxDrawCallbackStruct *cbs;
- {
- GLXwinset(XtDisplay(w), cbs->window);
-
- /* do all the lmdefs here */
-
- lmdef(DEFMATERIAL,MAT_BRASS,SZ(mat_brass),mat_brass);
- lmdef(DEFMATERIAL,MAT_REDPLASTIC,SZ(mat_redplastic),mat_redplastic);
- lmdef(DEFMATERIAL,MAT_SILVER,SZ(mat_silver),mat_silver);
- lmdef(DEFMATERIAL,MAT_GRNPLASTIC,SZ(mat_grnplastic),mat_grnplastic);
-
- lmdef(DEFLMODEL, LTM_INFINITE,SZ(infinite),infinite);
- lmdef(DEFLMODEL, LTM_LOCAL,SZ(local),local);
- lmdef(DEFLMODEL, LTM_INF_TWO,SZ(infinite),infinite);
-
- lmdef(DEFLIGHT, LT_INF_WHITE,SZ(white_inf_light),white_inf_light);
- lmdef(DEFLIGHT, LT_INF_RED,SZ(red_inf_light),red_inf_light);
-
- zbuffer(TRUE);
- }
-
- Boolean
- trackBallMotion()
- {
- anglex += 20;
- angley += 20;
- anglez += 20;
- if (anglex >= 3600) anglex = 0;
- if (angley >= 3600) angley = 0;
- if (anglez >= 3600) anglez = 0;
-
- refresh = 1;
- drawScene();
- return(0);
- }
-
- void
- animation(flag)
- int flag;
- {
- Boolean trackBallMotion();
- static XtWorkProcId wpid;
-
- if (flag == 0) {
- if (doTumble == 1) XtRemoveWorkProc(wpid);
- doTumble = 0;
- }
- else if (doTumble == 0) {
- doTumble = 1;
- wpid = XtAppAddWorkProc(appContext,trackBallMotion,NULL);
- }
- }
-